//
//  YDThread.m
//  YDBASE
//
//  Created by rowena on 2019/5/15.
//  Copyright © 2019 wuyezhiguhun. All rights reserved.
//

#import "YDThread.h"

@implementation YDThread

static YDThread *thread = nil;
/**
 * 创建单例
 * @return 返回YDThread 对象
 */
+ (instancetype)sharedThread {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        thread = [[YDThread alloc] init];
    });
    return thread;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    if (thread == nil) {
        thread = [super allocWithZone:zone];
    }
    return thread;
}

/**
 * 创建线程 类方法
 * @pram target 目标对象
 * @pram selector 执行函数
 * @pram service 线程优先级
 * @pram name 线程名字
 * @pram argument 论点
 * @pram open 是否开启线程 YES：开启线程 NO：不开启线程
 * @return 返回创建的线程
 */
+ (NSThread *)yd_NewThreadWithTarget:(id)target
                            selector:(SEL)selector
                             service:(NSQualityOfService)service
                                name:(NSString *)name
                              object:(nullable id)argument
                                open:(BOOL)open {
    //创建线程
    NSThread *thread = [[NSThread alloc] initWithTarget:target selector:selector object:argument];
    
    /** NSQualityOfService:
     NSQualityOfServiceUserInteractive：最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上
     NSQualityOfServiceUserInitiated：次高优先级，主要用于执行需要立即返回的任务
     NSQualityOfServiceDefault：默认优先级，当没有设置优先级的时候，线程默认优先级
     NSQualityOfServiceUtility：普通优先级，主要用于不需要立即返回的任务
     NSQualityOfServiceBackground：后台优先级，用于完全不紧急的任务
     */
    //设置线程优先级
    thread.threadPriority = service;
    //设置线程名称
    thread.name = name;
    
    if (open) {
        [thread start];
    }
    
    return thread;
}

/**
 * 创建线程 类方法
 * @pram target 目标对象
 * @pram selector 执行函数
 * @pram service 线程优先级
 * @pram name 线程名字
 * @pram argument 论点
 * @pram open 是否开启线程 YES：开启线程 NO：不开启线程
 * @return 返回创建的线程
 */
- (NSThread *)yd_NewThreadWithTarget:(id)target
                            selector:(SEL)selector
                             service:(NSQualityOfService)service
                                name:(NSString *)name
                              object:(nullable id)argument
                                open:(BOOL)open {
    //创建线程
    NSThread *thread = [[NSThread alloc] initWithTarget:target selector:selector object:argument];
    
    /** NSQualityOfService:
     NSQualityOfServiceUserInteractive：最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上
     NSQualityOfServiceUserInitiated：次高优先级，主要用于执行需要立即返回的任务
     NSQualityOfServiceDefault：默认优先级，当没有设置优先级的时候，线程默认优先级
     NSQualityOfServiceUtility：普通优先级，主要用于不需要立即返回的任务
     NSQualityOfServiceBackground：后台优先级，用于完全不紧急的任务
     */
    //设置线程优先级 调度优先级的取值范围是0.0 ~ 1.0，默认0.5，值越大，优先级越高。
    thread.threadPriority = service;
    //设置线程名称
    thread.name = name;
    
    if (open) {
        [thread start];
    }
    
    return thread;
}

/**
 * 加锁代码块
 * @pram back 回调代码块
 */
+ (void)yd_SynchronizedBack:(nullable void (^)(void))back {
    NSLock *lock = [[NSLock alloc] init];
    //加锁
    [lock lock];
    //执行加锁代码块内容
    back();
    //解锁
    [lock unlock];
}


@end
